package com.lollipop.demo.controller;

import com.lollipop.checkin.dto.CheckInRequest;
import com.lollipop.checkin.dto.CheckInResponse;
import com.lollipop.checkin.service.CheckInService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;

import java.time.LocalDate;
import java.util.List;

import org.springframework.data.redis.core.RedisTemplate;

import java.util.concurrent.TimeUnit;

/**
 * 演示控制器
 * 展示如何使用签到功能
 */
@RestController
@RequestMapping("/api/demo")
public class DemoController {

    @Autowired
    private CheckInService checkInService;

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 演示用户签到
     *
     * @param request 签到请求参数，包含用户ID、活动ID和签到日期
     * @return 签到结果
     */
    @Operation(summary = "用户签到", description = "提交用户签到信息")
    @PostMapping("/checkin")
    public CheckInResponse demoCheckIn(
            @Parameter(description = "签到请求参数") @RequestBody CheckInRequest request) {
        return checkInService.checkIn(request);
    }

    /**
     * 演示获取用户签到记录
     *
     * @param userId 用户ID
     * @return 签到记录列表
     */
    @Operation(
        summary = "获取签到记录", 
        description = "查询用户的所有签到日期。在Swagger UI中，userId是路径参数，需要直接在URL路径中输入，例如 /api/demo/checkin-records/user123"
    )
    @GetMapping("/checkin-records/{userId}")
    public List<String> demoGetCheckInRecords(
            @Parameter(description = "用户ID", example = "user123", required = true)
            @PathVariable("userId") String userId) {
        return checkInService.getUserCheckInRecords(userId);
    }

    /**
     * 演示获取用户连续签到天数
     *
     * @param userId 用户ID
     * @return 连续签到天数
     */
    @GetMapping("/continuous-days/{userId}")
    public int demoGetContinuousDays(@Parameter(description = "用户ID") @PathVariable("userId") String userId) {
        return checkInService.getUserContinueCheckInDays(userId);
    }

    /**
     * 演示获取用户总签到天数
     *
     * @param userId 用户ID
     * @return 总签到天数
     */
    @GetMapping("/total-days/{userId}")
    public int demoGetTotalDays(@Parameter(description = "用户ID") @PathVariable("userId") String userId) {
        return checkInService.getUserTotalCheckInDays(userId);
    }

    /**
     * 演示获取活动签到人数
     *
     * @param activityId 活动ID
     * @return 签到人数
     */
    @GetMapping("/activity-participants/{activityId}")
    public long demoGetActivityParticipants(@Parameter(description = "活动ID") @PathVariable("activityId") String activityId) {
        return checkInService.getActivityCheckInUsersCount(activityId);
    }

    /**
     * 演示重置用户签到数据
     *
     * @param userId 用户ID
     * @return 是否重置成功
     */
    @DeleteMapping("/reset-checkin/{userId}")
    public boolean demoResetCheckInData(@Parameter(description = "用户ID") @PathVariable("userId") String userId) {
        return checkInService.resetUserCheckInData(userId);
    }

    /**
     * 测试Redis连接是否有效
     *
     * @return 连接测试结果
     */
    @GetMapping("/test-redis-connection")
    public String testRedisConnection() {
        try {
            // 测试Redis连接和基本操作
            String testKey = "redis_connection_test";
            String testValue = "connection_success_" + System.currentTimeMillis();

            // 设置键值对并设置过期时间
            redisTemplate.opsForValue().set(testKey, testValue, 5, TimeUnit.MINUTES);

            // 获取值验证
            String retrievedValue = (String) redisTemplate.opsForValue().get(testKey);

            if (testValue.equals(retrievedValue)) {
                return "Redis连接有效，操作成功";
            } else {
                return "Redis连接异常，获取的值不匹配";
            }
        } catch (Exception e) {
            return "Redis连接失败: " + e.getMessage();
        }
    }
}